package com.school.test;

import com.school.entity.Course;
import com.school.entity.Student;
import com.school.entity.Teacher;
import java.util.ArrayList;
import java.util.List;

/**
 * 测试类：跨包调用entity包的类，验证继承、构造、权限控制与业务逻辑
 */
public class TestMain {
    public static void main(String[] args) {
        // 1. 实例化课程（跨包访问Course的public构造）
        Course javaCourse = new Course("C001", "Java编程", "教学楼A101", "周一 8:00-10:00");
        Course dsCourse = new Course("C002", "数据结构", "教学楼B202", "周三 14:00-16:00");

        // 2. 实例化教师（子类构造自动调用父类构造）
        Teacher wangTeacher = new Teacher("T001", "王老师", "男");
        Teacher zhaoTeacher = new Teacher("T002", "赵老师", "女");

        // 3. 实例化学生（子类构造通过super()初始化父类属性）
        Student liStudent = new Student("S001", "小李", "男");
        Student zhangStudent = new Student("S002", "小张", "女");

        // 4. 存储教师列表（用于学生课表关联教师）
        List<Teacher> teacherList = new ArrayList<>();
        teacherList.add(wangTeacher);
        teacherList.add(zhaoTeacher);

        // 5. 模拟教师开课（调用Teacher的个性方法）
        wangTeacher.openCourse(javaCourse);
        zhaoTeacher.openCourse(dsCourse);

        // 6. 模拟学生选课、退课（调用Student的个性方法）
        liStudent.selectCourse(javaCourse);  // 小李选Java
        liStudent.selectCourse(dsCourse);    // 小李选数据结构
        zhangStudent.selectCourse(javaCourse); // 小张选Java
        liStudent.dropCourse(dsCourse);      // 小李退选数据结构

        // 7. 打印教师工作单（调用父类抽象方法的子类实现）
        wangTeacher.printWork();
        zhaoTeacher.printWork();

        // 8. 打印学生课表（调用重载的printWork，关联教师信息）
        liStudent.printWork(teacherList);
        zhangStudent.printWork(teacherList);

        // 9. 权限验证：外部包无法直接访问Person的protected属性（如下代码会报错，注释后可运行）
        // System.out.println(liStudent.name); // 错误：name是protected，仅子类和同包可见
        // 正确方式：通过Getter访问protected属性
        System.out.println("\n【权限验证】学生小李的姓名：" + liStudent.getName());
        System.out.println("【权限验证】教师王老师的ID：" + wangTeacher.getId());
    }
}